package com.rijndael;


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: aes 对称加密
 * 加密用的Key 可以用26个字母和数字组成，最好不要用保留字符，虽然不会错，至于怎么裁决，个人看情况而定  
  此处使用AES-128-CBC加密模式，key需要为16位。  
 * @date 2018/4/217:33
 */
public class AES3 {

	  private static final String defaultCharset = "UTF-8";
//    private static final String KEY_AES = "AES";
    private static final String KEY_AES = "AES/CBC/PKCS5Padding";
    private static final String KEY = "1234562342342341";
	// 加密   
    public static String encrypt(String sSrc) throws Exception {   
        
        // 判断Key是否为16位   
        if (KEY.length() != 16) {   
            System.out.print("Key长度不是16位");   
            return null;   
        }   
        byte[] raw = KEY.getBytes();   
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance(KEY_AES);//"算法/模式/补码方式"   
        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式，需要一个向量iv，可增加加密算法的强度   
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);   
        byte[] encrypted = cipher.doFinal(sSrc.getBytes());   
   
        return Base64.encodeBase64String(encrypted);//此处使用BAES64做转码功能，同时能起到2次加密的作用。   
    }   
   
    // 解密   
    public static String decrypt(String sSrc) throws Exception {   
        try {   
        	// 判断Key是否为16位   
            if (KEY.length() != 16) {   
                System.out.print("Key长度不是16位");   
                return null;   
            }   
            byte[] raw = KEY.getBytes("ASCII");   
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
            Cipher cipher = Cipher.getInstance(KEY_AES);   
            IvParameterSpec iv = new IvParameterSpec("0102030405060708"   
                    .getBytes());   
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);   
            byte[] encrypted1 = Base64.decodeBase64(sSrc);//先用bAES64解密   
            try {   
                byte[] original = cipher.doFinal(encrypted1);   
                String originalString = new String(original);   
                return originalString;   
            } catch (Exception e) {   
                System.out.println(e.toString());   
                return null;   
            }   
        } catch (Exception ex) {   
            System.out.println(ex.toString());   
            return null;   
        }   
    }   
    
    public static void main(String[] args) throws Exception {
    	String encrypt = encrypt("0xc3fe833de36fa85b62136781fc5c64d30b6876a5c231b4b519adb9fb3d471bad");
		System.out.println("encrypt::"+encrypt);
		String decrypt = decrypt(encrypt);
		System.out.println("decrypt::"+decrypt);
	}


}
